package com.universe.titan.common.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang.StringUtils;

/**
 * json格式数据转换工具
 */
public class JsonUtil {

    private static final ObjectMapper mapper = new ObjectMapper();

    /**
     * 对象转换成json字符串
     *
     * @date：2015-5-29
     * @param obj
     * @return
     */
    public static String objectToJson(Object obj) {
        String result = JSON.toJSONString(obj);
        return result;
    }
    /**
     * 对象转换成json字符串
     *          ps:属性为空  也会包含
     *
     * @date：2015-5-29
     * @param obj
     * @return
     */
    public static String objectToJsonHasNullFiled(Object obj) throws JsonProcessingException {
        return mapper.writeValueAsString(obj);
    }

    /**
     * @Description：通过fastjson生成json格式字符串
     * @date：2015-5-29
     * @param t
     * @return
     */
    public static <T extends Object> String toJsonString(T t) {
        StringBuilder builder = new StringBuilder("");
        builder.append(JSON.toJSONStringWithDateFormat(t, "yyyy-MM-dd HH:mm:ss", SerializerFeature.WriteDateUseDateFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullStringAsEmpty,
                                                       SerializerFeature.WriteNullBooleanAsFalse, SerializerFeature.WriteNullListAsEmpty));
        return builder.append("").toString();
    }
    /**
     * @Description：通过fastjson生成json格式字符串，不转换成序列化的字段
     * @date：2015-5-29
     * @param t
     * @return
     */
    public static <T extends Object> String toJsonStringNoSeria(T t) {
    	StringBuilder builder = new StringBuilder("");
    	builder.append(JSON.toJSONStringWithDateFormat(t, "yyyy-MM-dd HH:mm:ss"));
    	return builder.append("").toString();
    }

    /**
     * @Description：通过fastjson生成json格式字符串
     * @date：2015-5-29
     * @param t
     * @return
     */
    public static <T extends Object> String toJsonStringNoFormat(T t) {
        StringBuilder builder = new StringBuilder("");
        builder.append(JSON.toJSONString(t));
        return builder.append("").toString();
    }

    /**
     * @Description：将json格式的字符串转换成制定的对象
     * @date：2015-5-29
     * @param jsonstr
     * @param ref
     * @return
     * @throws Exception
     */
    public static <T extends Object> T parseToObject(String jsonstr, TypeReference<T> ref) {
        if (jsonstr == null || "".equals(jsonstr.trim())) {
            return null;
        }
        jsonstr = jsonstr.trim();
        return JSONObject.parseObject(jsonstr, ref);
    }

    /**
     * @Description：将json格式的字符串转换成制定的对象
     * @date：2015-5-29
     * @param jsonstr
     * @param clz
     * @return
     * @throws Exception
     */
    public static <T extends Object> T parseToObject(String jsonstr, Class<T> clz) {
        if (jsonstr == null || "".equals(jsonstr.trim())) {
            return null;
        }
        jsonstr = jsonstr.trim();
        return JSONObject.parseObject(jsonstr, clz);
    }

    /**
     * 是否为json，是返回true
     * @param json
     * @return
     */
    public static boolean isJson(String json){
    	if(StringUtils.isEmpty(json)) {
            return false;
        }
    	try {
            json = json.trim();
            if ((json.startsWith("{") && json.endsWith("}")) || (json.startsWith("[") && json.endsWith("]"))) {
                JSONObject.parse(json);
                return true;
            }else {
                return false;
            }
		} catch (Exception e) {
			return false;
		}
    }

    /**
     * JSONObject.getJSONArray(key) ，但是对json有做null处理
     * json为null或者key不存在都返回空数组
     *
     * @param json
     * @param key
     * @return
     */
    public static JSONArray getJSONArray(JSONObject json, String key) {
        if (json != null && json.containsKey(key)) {
            return json.getJSONArray(key);
        }
        return new JSONArray();
    }
}